Come personalizzare WinAMP

Un tip di fondamentale importanza per tutte quelle persone che voglioni realizzare 'in casa' alcune versioni
modificate del player mp3 più noto di tutti i tempi, oppure per chiunque intenda aggiungere un supporto esteso di playing mp3 nelle sue realizzazioni. 
Tip fornito dal sig. S.Paganotti
 
La prima cosa da fare è identificare la finestra di winamp ( estendendo la soluzione si potrebbe anche utilizzare una API di windows per lanciare winamp 
dallo stesso programma ); l'identificazione avviene semplicemente nel seguente modo:
 
HWND winamp;
winamp = FindWindow("Winamp v1.x",NULL);
 
a questo punto i comandi eseguibili sono tantissimi, di seguito sono elencati solo i più utili, i comandi vengono inviati a winamp tramite l'API SendMessage:
 
SendMessage(winamp, WM_COMMAND,40045,0);
Simula la pressione del tasto "play" di winamp, eseguendo il primo brano
della playlist.
 
SendMessage(winamp,WM_WA_IPC,playlistpos,121);
Winamp esegue il brano alla posizione specificata dalla 
variabile 'playlistpos'
 
Ed ecco un utilissimo comando che permette di aggiungere un file alla playlist di winamp:
 
COPYDATASTRUCT cds;
cds.dwData = 100;
cds.lpData = (void *) "file.mp3";
cds.cbData = strlen((char *) cds.lpData)+1; // include space for null char
SendMessage(winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds)
 
Esistono tantissimi altri comandi per richamare praticamente tutte le funzionalià di winamp, utilissimo a questo fine è il file frontend.h che si trova direttamente sul sito di winamp e che è allegato al supporto CDr-Rom della rivista

La serializzazione XML con C#

.NET mette a disposizione due metodi, Serialize e Deserialize, che permettono di leggere e scrivere XML in modo trasparente. Grazie, infatti, alla programmazione per attributi è possibile identificare ciascun membro di una classe con un elemento dello schema XML. All'atto della serializzazione della classe genererà un file XML che segue lo schema pre-definito con i valori dei vari attributi pari ai valori delle variabili membro delle classi. La lettura di un file XML avviene con il metodo Deserialize che non fa altro che assegnare ad ogni variabile membro della classe, il valore corrispondente del tag xml.
Trovate il progetto completo nella directory /tips del Cd-Rom allegato o digitando l’url: www.itportal.it/ioprog71/tips
Tip fornito dal Sig. D.Camassi

Shutdown di Windows...e non solo

Con questa procedura è possibile avere accesso alla libreria user32.dll per
poter agire sull'uscita di Windows. E' possibile settare la procedura per: terminare bruscamente il sistema, riavviare, spegnere il computer, fare lo shutdown di sistema o semplicemente il logoff.
Tip fornito dal Sig. P.Failla

//-------------------------------------------
 
E' necessario includere tra gli header winuser.h

void __fastcall TForm1::ShutDown(TObject *Sender)
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp; //definisce una struttura che contiene il settaggio dei privilegi per il token

        // Prendo un token per questo processo.
       
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))             
        //"OpenProcessToken" apre l'accesso a un token associato con un processo
        //"GetCurrentProcess" ritorna un pseudohandle per il processo corrente
        //"TOKEN_ADJUST_PRIVILEGES" abilita o disabilita i privilegi di accesso del token
        
        error("OpenProcessToken"); //o un'altra procedura di gestione errori
                
        // Prendo il LUID (Locally Unique IDentifier) per i privilegi di shutdown.
        
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        
        //"SE_SHUTDOWN_NAME" è il privilegio richiesto per spegnere una macchina locale
        // Prende i privilegi per questo processo
        
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
        
        //"AdjustTokenPrivileges" abilita o disabilita i privilegi di accesso del token
        
        if (GetLastError() != ERROR_SUCCESS)
        error("AdjustTokenPrivileges"); //o un'altra procedura di gestione errori
                
        //Chiudo il sistema e forzo la chiusura delle applicazioni
        
        if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
        error(ExitWindowsEx); //o un'altra procedura di gestione errori
        
        //"ExitWindowsEx" gestisce l'uscita da un sistema Windows supporta 5 tipi di parametri flag
        //" bool ExitWindowsEx (UINT flag, DWORD reserved); " 
        //"EWX_FORCE" forza la terminazione dei processi Windows non manda i messaggi di fine 
        //            sessione e il sistema termina drasticamente con possibili perdite di dati
        //"EWX_LOGOFF" termina i processi e fa il Logoff
        //"EWX_POWEROFF" termina i processi e spegne il computer
        //"EWX_REBOOT" riavvia
        //"EWX_SHUTDOWN" termina i processi e mette il computer in attesa di power off   
        
}

E' necessario includere tra gli header winuser.h

void __fastcall TForm1::ShutDown(TObject *Sender)
{
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp; //definisce una struttura che contiene il settaggio dei privilegi per il token

        // Prendo un token per questo processo.
       
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))             
        //"OpenProcessToken" apre l'accesso a un token associato con un processo
        //"GetCurrentProcess" ritorna un pseudohandle per il processo corrente
        //"TOKEN_ADJUST_PRIVILEGES" abilita o disabilita i privilegi di accesso del token
        
        error("OpenProcessToken"); //o un'altra procedura di gestione errori
                
        // Prendo il LUID (Locally Unique IDentifier) per i privilegi di shutdown.
        
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        
        //"SE_SHUTDOWN_NAME" è il privilegio richiesto per spegnere una macchina locale
        // Prende i privilegi per questo processo
        
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
        
        //"AdjustTokenPrivileges" abilita o disabilita i privilegi di accesso del token
        
        if (GetLastError() != ERROR_SUCCESS)
        error("AdjustTokenPrivileges"); //o un'altra procedura di gestione errori
                
        //Chiudo il sistema e forzo la chiusura delle applicazioni
        
        if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
        error(ExitWindowsEx); //o un'altra procedura di gestione errori
        
        //"ExitWindowsEx" gestisce l'uscita da un sistema Windows supporta 5 tipi di parametri flag
        //" bool ExitWindowsEx (UINT flag, DWORD reserved); " 
        //"EWX_FORCE" forza la terminazione dei processi Windows non manda i messaggi di fine 
        //            sessione e il sistema termina drasticamente con possibili perdite di dati
        //"EWX_LOGOFF" termina i processi e fa il Logoff
        //"EWX_POWEROFF" termina i processi e spegne il computer
        //"EWX_REBOOT" riavvia
        //"EWX_SHUTDOWN" termina i processi e mette il computer in attesa di power off   
        
}